using Wizard.Source;

namespace Wizard.Runtime
{
    public interface IBlockInstance
    {
        IBlockSource BlockSource { get; }
        
    //    internal StatementSource mStatementSource;
    //    internal IStatement mCurrentStatement;
    //    internal StatementSource mIBlockSource;
    //    internal StatementSource mGosub;
    //    internal int mIndex;
    //    internal IStatement mParentStatementInstance;
    //    internal StatementInstance mParentBlockInstance;
    //    internal RunningState mRunning;
    //    internal MethodEngine mScripEngine;
    //    internal List<Stack<VariableValue>> mVariables;

    //    public StatementInstance(MethodEngine methodEngine, StatementSource statementSource, IStatement parentStatementInstance,
    //                        StatementInstance parentBlockInstance)
    //    {
    //        mScripEngine = methodEngine;
    //        mIBlockSource = statementSource;
    //        mParentStatementInstance = parentStatementInstance;
    //        mParentBlockInstance = parentBlockInstance;
    //        //mIndex = 0;
    //        if (mIBlockSource == null) mRunning = RunningState.BeforeEnter;
    //        else
    //        {
    //            if (mIndex < mIBlockSource.Count)
    //            {
    //                mStatementSource = mIBlockSource.mStatements[mIndex];
    //                mRunning = RunningState.BeforeEnter;
    //            }
    //            else mRunning = RunningState.Finished;
    //        }
    //    }

    //    public StatementSource Gosub
    //    {
    //        get { return mGosub; }
    //        set { mGosub = value; }
    //    }

    //    public bool IsCurrent()
    //    {
    //        return (mScripEngine.mBlockInstance == this);
    //    }

    //    internal bool IncIndex()
    //    {
    //        mIndex++;
    //        if (mIndex < mIBlockSource.Count)
    //        {
    //            mStatementSource = mIBlockSource.mStatements[mIndex];
    //            return true;
    //        }
    //        else
    //        {
    //            mStatementSource = null;
    //            return false;
    //        }
    //    }

    //    private bool ProcessGosub()
    //    {
    //        if (mGosub == null) return false;
    //        try
    //        {
    //            mScripEngine.mInstanceStack.Push(this);
    //            var newBlockInstance = new StatementInstance(mScripEngine, mGosub, mCurrentStatement, this);
    //            mScripEngine.mBlockInstance = newBlockInstance;
    //            return true;
    //        }
    //        finally
    //        {
    //            mGosub = null;
    //        }
    //    }

    //    internal void StepForward()
    //    {

    //    }

    //    internal bool GetVariable(VariableSource variable, out IHasValue runResult)
    //    {
    //        runResult = null;

    //        if (mVariables == null) return false;
    //        var varIdx = variable.mVarIdx;
    //        if (varIdx >= mVariables.Count) return false;
    //        var st = mVariables[varIdx];
    //        if (st == null) return false;
    //        VariableValue vv = null;
    //        if (st.Count > 0)
    //        {
    //            vv = st.Peek();
    //            //if (r.BlockInstance == this)
    //            //{
    //            runResult = vv;
    //            return true;
    //            //}
    //        }
    //        return false;
    //    }

    //    internal bool SetValue(VariableSource mVariable, object value)
    //    {
    //        if (mVariables == null) mVariables = new List<Stack<VariableValue>>();
    //        var varIdx = mVariable.mVarIdx;
    //        while (varIdx >= mVariables.Count)
    //        {
    //            mVariables.Add(null);
    //        }
    //        var st = mVariables[varIdx];
    //        if (st == null)
    //        {
    //            st = new Stack<VariableValue>();
    //            mVariables[varIdx] = st;
    //        }
    //        VariableValue vv;
    //        if (st.Count > 0)
    //        {
    //            vv = st.Peek();
    //            vv.SetValueObject(this, value);
    //            return true;
    //        }
    //        vv = new VariableValue(mVariable, this);
    //        vv.SetValueObject(this, value);
    //        st.Push(vv);
    //        return true;
    //    }

    //    #region Nested type: VariableValue

    //    internal class VariableValue : IReadWriteValue
    //    {
    //        public readonly StatementInstance BlockInstance;
    //        public readonly VariableSource Variable;
    //        private object mValue;

    //        public VariableValue(VariableSource variable, StatementInstance statementInstance)
    //        {
    //            Variable = variable;
    //            BlockInstance = statementInstance;
    //        }

    //        #region IReadWriteValue Members

    //        Type IHasValue.ValueType
    //        {
    //            get { return Variable.VariableType; }
    //        }

    //        public object GetValueObject(StatementInstance statementInstance)
    //        {
    //            return mValue;
    //        }

    //        public void SetValueObject(StatementInstance statementInstance, object value)
    //        {
    //            if (!value.Equals(mValue))
    //            {
    //                mValue = value;
    //                if (ValueChanged != null) ValueChanged(statementInstance, new ValueChangedEventArgs());
    //            }
    //        }

    //        public event ValueChangedEvent ValueChanged;

    //        #endregion
    //    }

    //    #endregion

        //internal void GetVariableValue(BlockVariable variable)
        //{

        //    throw new System.NotImplementedException();
        //}

        //internal void SetVariableValue(BlockVariable variable, object value)
        //{

        //    throw new System.NotImplementedException();
        //}
    }
}